const process = require('process')

// 异步流程控制
// 先定义函数，函数内部通过定义回调函数传递给下一个函数
// 中间件函数处理数据，再通过回调函数传递给最终函数
// 最终函数通过回调函数返回结果给调用者
// 可以理解成调用者提供一个回调函数来接收多次处理后的结果，这样可以避免回调地狱

// 最终处理数据后再通过callback返回结果给调用者
function final(someInput, callback) {
  callback(`${someInput} and terminated by executing callback `)
}

// 在中间件中处理一下输入
function middleware(someInput, callback) {
  final(`${someInput} touched by middleware `, callback)
}

function initial() {
  const someInput = 'hello this is a function'
  middleware(someInput, function (result) {
    console.log(result)
  })
}

// initial()

// 这里的例子是一个简单的异步流程控制
// 但是如果再for循环中执行的部分用steTimeout模拟异步操作，那么在singSong函数中调用getSong函数时，会进入throw new Error("song is '' empty, FEED ME A SONG!")分支
// 可以理解成getSong函数执行完后，返回的song是空的，因为for循环中的setTimeout是异步操作，所以getSong函数执行完后，for循环中的异步操作还没有执行完
// 详细参考https://juejin.cn/post/7380283002482196543
function getSong() {
  let _song = ''
  for (let i = 100; i > 0; i -= 1) {
    _song += `${i} bottles of beer on the wall, you take one down and pass it around,${
      i - 1
    } bottles of beer on the wall.\n`
    if (i === 1) {
      _song += "Hey! let's get some more beer."
    }
  }
  return _song
}

function singSong(song) {
  if (!song) {
    throw new Error("song is '' empty, FEED ME A SONG!")
  }
  console.log(song)
}

// const song = getSong()

// singSong(song)
